package com.im.common.netty.base.handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

/**
 * `ChannelInboundHandlerAdapter` 是 Netty 中用于处理入站事件的适配器类，它实现了 `ChannelInboundHandler` 接口，可以方便地处理各种入站事件。具体来说，`ChannelInboundHandlerAdapter` 可以处理的入站事件包括：
 *
 * - `channelRegistered(ChannelHandlerContext ctx)`：当连接已经被建立时调用。
 * - `channelActive(ChannelHandlerContext ctx)`：当连接已经被建立并且可以进行通信时调用。
 * - `channelRead(ChannelHandlerContext ctx, Object msg)`：当从客户端接收到数据时调用。
 * - `channelReadComplete(ChannelHandlerContext ctx)`：当读取完从客户端接收到的数据后调用。
 * - `channelInactive(ChannelHandlerContext ctx)`：当连接已经被关闭时调用。
 * - `exceptionCaught(ChannelHandlerContext ctx, Throwable cause)`：当处理过程中在 ChannelPipeline 中有异常抛出时调用。
 *
 * 通过继承 `ChannelInboundHandlerAdapter` 类并重写上述方法，我们可以编写自定义的处理器，用于实现特定的业务逻辑。
 * 在下面的代码中，我们编写了一个自定义的处理器 `DiscardServerHandler`，用于处理客户端发送的字符串，并将其原样返回给客户端。
 */
public class DiscardServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("有客户端连接了");
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 接收到客户端发送的消息
        ByteBuf out = (ByteBuf) msg;
        String data = out.toString(CharsetUtil.UTF_8);
        System.out.print("收到消息：" + data);
        // 发送消息给客户端
        short length = (short) data.getBytes().length;
        ByteBuf byteBuf = Unpooled.directBuffer(8);
        byteBuf.writeShort(length);
        byteBuf.writeBytes(data.getBytes());
        ctx.writeAndFlush(byteBuf);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("有客户端断开了");
    }
}
